#pragma once

namespace Yohifo
{
	template<class iterator, class Ref, class Ptr>
	struct reverse_iterator
	{
		iterator _cur;
		typedef reverse_iterator<iterator, Ref, Ptr> self;

		reverse_iterator(const iterator& it)
			:_cur(it)
		{}

		Ref operator*()
		{
			iterator tmp(_cur);
			return *--tmp;
		}

		Ptr operator->()
		{
			return &(operator*());
		}

		self& operator++()
		{
			--_cur;
			return *this;
		}

		self operator++(int)
		{
			iterator tmp(_cur);
			--(*this);
			return self(tmp);
		}

		self& operator--()
		{
			++_cur;
			return *this;
		}

		self operator--(int)
		{
			iterator tmp(_cur);
			++(*this);
			return self(tmp);
		}

		bool operator==(const self& s)
		{
			return _cur == s._cur;
		}

		bool operator!=(const self& s)
		{
			return !(*this == s);
		}
	};
}